﻿using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace MTUnity.Utils
{
	public static class JsonUtils
	{
		public static Dictionary<Type, JsonType> m_sType2JsonType = new Dictionary<Type, JsonType>
		{
			{ Type.GetType("System.Int32") , JsonType.Int},
			{ Type.GetType("System.Int64") , JsonType.Long},
			{ Type.GetType("System.Double") , JsonType.Double},
		};
		#region TypeCast
		public static int ToInt(JsonData jsonData)
		{
			object obj;
			JsonType jsonType = jsonData.GetJsonType();
			if (jsonData.IsInt)
			{
				obj = (int)jsonData;
			}
			else if (jsonData.IsLong)
			{
				obj = (long)jsonData;
			}
			else if (jsonData.IsDouble)
			{
				obj = (double)jsonData;
			}
			else
			{
				obj = default(int);
			}
			int iReturnValue = System.Convert.ToInt32(obj);
			return iReturnValue;
		}

		public static long ToLong(JsonData jsonData)
		{
			object obj;
			JsonType jsonType = jsonData.GetJsonType();
			if (jsonData.IsInt)
			{
				obj = (int)jsonData;
			}
			else if (jsonData.IsLong)
			{
				obj = (long)jsonData;
			}
			else if (jsonData.IsDouble)
			{
				obj = (double)jsonData;
			}
			else
			{
				obj = default(int);
			}
			long lReturnValue = System.Convert.ToInt64(obj);
			return lReturnValue;
		}

		public static double ToDouble(JsonData jsonData)
		{
			object obj;
			JsonType jsonType = jsonData.GetJsonType();
			if (jsonData.IsInt)
			{
				obj = (int)jsonData;
			}else if (jsonData.IsLong)
			{
				obj = (long)jsonData;
			}
			else if (jsonData.IsDouble)
			{
				obj = (double)jsonData;
			}
			else
			{
				obj = default(double);
			}
			double dReturnValue = System.Convert.ToDouble(obj);
			return dReturnValue;
		}
		#endregion

		public static void GenerateJsonDataWithFieldName(ref JsonData jsonData, string strFieldName, object data)
		{
			if (jsonData == null)
			{
				jsonData = new JsonData();
			}
			if (jsonData.GetJsonType() != JsonType.Object)
			{
				jsonData.SetJsonType(JsonType.Object);
			}
			if (data != null)
			{
				if (m_sType2JsonType.ContainsKey(data.GetType()))
				{
					jsonData[strFieldName] = new JsonData(data);
				}
				else if (data is JsonData)
				{
					jsonData[strFieldName] = data as JsonData;
				}else if (data is IList)
				{
					JsonData arrayJson = new JsonData();
					arrayJson.SetJsonType(JsonType.Array);

					IList list = data as IList;
					foreach(var item in list)
					{
						string json = JsonMapper.ToJson(item);
						JsonData jsonElement = JsonMapper.ToObject(json);
						arrayJson.Add(jsonElement);
					}
					jsonData[strFieldName] = arrayJson;
				}
				else
				{
					string json = JsonMapper.ToJson(data);
					JsonData temp = JsonMapper.ToObject(json);
					jsonData[strFieldName] = temp;
				}

				
			}
			
			
		}

		public static JsonData GenerateJsonData(object data)
		{
			JsonData returnValue = null;
			if (data != null)
			{
				if (m_sType2JsonType.ContainsKey(data.GetType()))
				{
					returnValue = new JsonData(data);
				}
				else if (data is JsonData)
				{
					returnValue = data as JsonData;
				}
				else if (data is IList)
				{
					JsonData arrayJson = new JsonData();
					arrayJson.SetJsonType(JsonType.Array);

					IList list = data as IList;
					foreach (var item in list)
					{
						string json = JsonMapper.ToJson(item);
						JsonData jsonElement = JsonMapper.ToObject(json);
						arrayJson.Add(jsonElement);
					}
					returnValue = arrayJson;
				}
				else
				{
					string json = JsonMapper.ToJson(data);
					JsonData temp = JsonMapper.ToObject(json);
					returnValue = temp;
				}
			}
			return returnValue;
		}

		#region Warehouse.Temperature
		public static void GenerateTemperatureJsonData(ref JsonData jsonData)
		{
			if (jsonData == null)
			{
				jsonData = new JsonData();
			}
			if (jsonData.GetJsonType() != JsonType.Object)
			{
				jsonData.SetJsonType(JsonType.Object);
			}
			JsonData temperatureJsonData = new JsonData();
			temperatureJsonData.SetJsonType(JsonType.Object);
			jsonData[JsonFildName.Warehouse.Temperature] = temperatureJsonData;
		}

	
		public static void RecordTemperature2JsonData(List<FWarehouseHumitureRecord> list , JsonData jsonData)
		{

			JsonData recordTemperature = new JsonData();
			recordTemperature.SetJsonType(JsonType.Array);
			
			for (int i = 0; i < list.Count; i++)
			{
				JsonData temperature = new JsonData();
				temperature.SetJsonType(JsonType.Object);
				temperature[JsonFildName.Warehouse.Temperature] = list[i].Temperature;
				temperature[JsonFildName.Common.Timestamp] = list[i].Timestamp;
				recordTemperature.Add(temperature);
				//recordTemperature[i] = temperature;
			}
			jsonData[JsonFildName.Warehouse.Record_Temperature] = recordTemperature;
		}

		public static void CurrentTemperature2JsonData(double dCurrentTemperature , JsonData jsonData)
		{
			jsonData[JsonFildName.Warehouse.Current_Temperature] = dCurrentTemperature;
		}
		#endregion

		#region Warehouse.Humidity
		public static void GenerateHumidityJsonData(ref JsonData jsonData)
		{
			if (jsonData == null)
			{
				jsonData = new JsonData();
			}
			if (jsonData.GetJsonType() != JsonType.Object)
			{
				jsonData.SetJsonType(JsonType.Object);
			}
			JsonData humidityJsonData = new JsonData();
			humidityJsonData.SetJsonType(JsonType.Object);
			jsonData[JsonFildName.Warehouse.Humidity] = humidityJsonData;
		}

		public static void RecordHumidity2JsonData(List<FWarehouseHumitureRecord> list, JsonData jsonData)
		{

			JsonData recordHumidity = new JsonData();
			recordHumidity.SetJsonType(JsonType.Array);
			for (int i = 0; i < list.Count; i++)
			{
				JsonData humidity = new JsonData();
				humidity.SetJsonType(JsonType.Object);
				humidity[JsonFildName.Warehouse.Humidity] = list[i].Humidity;
				humidity[JsonFildName.Common.Timestamp] = list[i].Timestamp;
				recordHumidity.Add(humidity);
			}
			jsonData[JsonFildName.Warehouse.Record_Humidity] = recordHumidity;
		}

		public static void CurrentHumidity2JsonData(double dCurrentHumidity, JsonData jsonData)
		{
			jsonData[JsonFildName.Warehouse.Current_Humidity] = dCurrentHumidity;
		}
		#endregion

		#region Warehouse.Repertory
		public static void GenerateRepertoryJsonData(ref JsonData jsonData)
		{
			if (jsonData == null)
			{
				jsonData = new JsonData();
			}
			if (jsonData.GetJsonType() != JsonType.Object)
			{
				jsonData.SetJsonType(JsonType.Object);
			}
			JsonData repertoryJsonData = new JsonData();
			repertoryJsonData.SetJsonType(JsonType.Object);
			jsonData[JsonFildName.Warehouse.Repertory] = repertoryJsonData;
		}

		public static void CurrentRepertory2JsonData(int iTotalRepertoryInBuff , int iTotalRepertoryInStore , JsonData jsonData)
		{
			JsonData currentRepertory = new JsonData();
			currentRepertory.SetJsonType(JsonType.Object);
			currentRepertory[JsonFildName.Warehouse.TotalRepertoryInBuff] = iTotalRepertoryInBuff;
			currentRepertory[JsonFildName.Warehouse.TotalRepertoryInStore] = iTotalRepertoryInStore;

			jsonData[JsonFildName.Warehouse.Current_Repertory] = currentRepertory;
		}

		public static void RecordRepertory2JsonData(List<FWarehouseRepertoryRecord> list , JsonData jsonData)
		{
			JsonData recordRepertory = new JsonData();
			recordRepertory.SetJsonType(JsonType.Array);
			for(int i = 0; i < list.Count; i++)
			{
				JsonData repertory = new JsonData();
				repertory.SetJsonType(JsonType.Object);
				repertory[JsonFildName.Warehouse.RepertoryInBuff] = list[i].RepertoryInBuff;
				repertory[JsonFildName.Warehouse.RepertoryInStore] = list[i].RepertoryInStore;
				repertory[JsonFildName.Common.Timestamp] = list[i].Timestamp;
				recordRepertory.Add(repertory);
			}
			jsonData[JsonFildName.Warehouse.Record_Repertory] = recordRepertory;
		}
		#endregion

		


		#region Warehouse.StockInOrOut
		public static void GenerateStockInOrOutJsonData(ref JsonData jsonData)
		{
			if (jsonData == null)
			{
				jsonData = new JsonData();
			}
			if (jsonData.GetJsonType() != JsonType.Object)
			{
				jsonData.SetJsonType(JsonType.Object);
			}
			JsonData stockInOrOutJsonData = new JsonData();
			stockInOrOutJsonData.SetJsonType(JsonType.Object);
			jsonData[JsonFildName.Warehouse.StockInOrOut] = stockInOrOutJsonData;
		}

		public static void CurrentStockInOrOut2JsonData(int iInOrOutCount, double dInOrOutEfficient , JsonData jsonData)
		{
			jsonData[JsonFildName.Warehouse.InOrOutCount] = iInOrOutCount;
			jsonData[JsonFildName.Warehouse.InOrOutEfficient] = dInOrOutEfficient;
		}

		public static void RecordStockInOrOut2JsonData(List<FWarehouseStockInOrOutRecord> list, JsonData jsonData)
		{

			JsonData recordStockInOrOut = new JsonData();
			recordStockInOrOut.SetJsonType(JsonType.Array);
			for (int i = 0; i < list.Count; i++)
			{
				JsonData stockInOrOut = new JsonData();
				stockInOrOut.SetJsonType(JsonType.Object);
				stockInOrOut[JsonFildName.Warehouse.Average] = list[i].Average;
				stockInOrOut[JsonFildName.Common.Efficient] = list[i].Efficient;
				stockInOrOut[JsonFildName.Common.Timestamp] = list[i].Timestamp;
				recordStockInOrOut.Add(stockInOrOut);
			}
			jsonData[JsonFildName.Warehouse.Record_StockInOrOut] = recordStockInOrOut;
		}

		#endregion

		#region Warehouse.SortingLine
		public static void GenerateEnergyConsumptionJsonData(ref JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.EnergyConsumption , null);
			//if (jsonData == null)
			//{
			//	jsonData = new JsonData();
			//}
			//if (jsonData.GetJsonType() != JsonType.Object)
			//{
			//	jsonData.SetJsonType(JsonType.Object);
			//}
			//JsonData energyConsumptionJsonData = new JsonData();
			//energyConsumptionJsonData.SetJsonType(JsonType.Object);
			//jsonData[JsonFildName.SortingLine.EnergyConsumption] = energyConsumptionJsonData;
		}

		public static void CurrentEnergyConsumption2JsonData(double dCurrentEnergyConsumption , JsonData jsonData)
		{
			jsonData[JsonFildName.SortingLine.Current_EnergyConsumption] = dCurrentEnergyConsumption;
		}

		public static void RecordEnergyConsumption2JsonData(List<FEnergyConsumptionRecord> list , JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Record_EnergyConsumption, list);
		}

		public static void GenerateSortingLineJsonData(ref JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.SortingLineData , null);
		}

		public static void RecordSortingEfficient2JsonData(List<FSortingEfficientRecord> list , JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Record_SortingEfficient , list);
		}

		public static void RecordSortingDuration2JsonData(List<FSortingDurationRecord> list , JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Record_SortingDuration, list);
		}

		public static void RecordSortingCount2JsonData(List<FSortingCountRecord> list, JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Record_SortingCount, list);
		}

		public static void GeneratorCheckJsonData(ref JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Check, null);
		}

		public static void CurrentSortingCheck2JsonData(int iCheckInPlan , int iCheckInCompleted , JsonData jsonData)
		{
			JsonData currentCheck = null;
			GenerateJsonDataWithFieldName(ref currentCheck, JsonFildName.SortingLine.SortingCheckInPlan, iCheckInPlan);
			GenerateJsonDataWithFieldName(ref currentCheck, JsonFildName.SortingLine.SortingCheckInCompleted, iCheckInCompleted);
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Current_SortingCheck, currentCheck);
		}

		public static void RecordSortingCheck2JsonData(List<FSortingCheckRecord> list , JsonData jsonData)
		{
			GenerateJsonDataWithFieldName(ref jsonData, JsonFildName.SortingLine.Record_SortingCheck, list);
		}
		#endregion
	}

}
